| ..:: Menu ::.. | ..:: Lekcja 7: Piszemy instalator ::.. | ..::Info i Reklamy::.. |
|
Strona Główna Kursy DELPHI Kursy C++ Linki Forum Download Seriale Humor Reklama O autorze |
Budujemy instalatoraPrzedstawię tutaj proces tworzenia instalatora. Będzie to instalator na własne potrzeby. Będzie on w jednym pliku EXE zawierał instalowane pliki. Wygląd samego instalatora pozostawiam Wam.Oczywiście nasz instalator ma być w jednym pliku tak żeby nasz instalowany program "odklejał" się od EXEka i zapisywał w wybranym przez użytkownika katalogu. Pewnie największym problemem było włączenie samego pliku do EXEka, prawda? Dołączanie plików: Przygotuj sobie najpierw jakiś katalog - załóżmy "Setup". Tam skopiuj pliki, które chcesz włączyć do EXEka. Ja w swoim przykładzie włączam tylko jeden plik wykonywalny EXE. Naszym celem będzie stworzenie zasobu zawierającego właśnie plik EXE, który chcesz zainstalować. W przykładzie, który podaje plik dołączony do zasobów nazywać się będzie "Pad.exe". Najpierw stwórz plik tekstowy z zmień jego rozszerzenie na *.rc ( np. files.rc ). W Notatniku dopisz taką linię: PAD RCDATA "Pad.exe" README RCDATA "Readme.txt" Pierwszy człon to nazwa programu, drugi to typ pliku - w tym wypadku jest to program, a ostatni człon podany w cudzysłowach to nazwa pliku wykonywalnego - w moim przypadku jest to "Pad.exe" oraz plik Readme "Readme.txt". Zapisz cały plik. Jeżeli posiadasz Delphi to z pewnością program "brcc32.exe". Znajduje się on w katalogu ...Delphi\Bin. Skopiuj go do katalogu z Twoimi plikami ( tam gdzie masz plik *.rc ). Jest to program DOS-owy więc musisz uruchomić go z okienka MS -DOS. Ten program przekształci plik *.rc na *.res. Odpal więc okienko MS - DOS-a i przejdź do katalogu z plikiem *.rc oraz z programem "brcc32.exe". W DOS-ie do katalogów przechodzi się poleceniem: cd NazwaKatalogu Jeżeli chcesz przejść o katalog wyżej to stosujesz polecenie: cd.. A więc jeżeli już jesteś w tym katalogu to wpisz taką linię i wciśnij ENTER: brcc32.exe files.rc "Files.rc" to nazwa Twojego zasobu. Jeżeli wszystko pójdzie dobrze to obok pliku *.rc powinieneś ujrzeć plik z rozszerzeniem *.res.( w moim przypadku jest to plik o nazwie "files.RES". ). Gratulacje! Właśnie stworzyłeś zasób, który zawiera Twój plik EXE. Jest on zapewne dość duży ( w moim przypadku zajmuje 250 kB ). Wyciągnięcie programu z EXEka. Gdzieś w kodzie Twojego instalatora umieść taką linię: {$R FILES.RES} "Files.res" to Twoja nazwa zasobu. Od tej pory zasoby te są włączone do instalatora. Pozostało jeszcze napisanie samej procedury, która wyciągnie z zasobów program i zapisze go gdzieś na dysku: Wygląda ona tak: procedure TMainFrm.InstallClick(Sender: TObject); { Rekord ten zawiera dwie pozycje. Pierwsza okresla tutul instalowanego pliku, ktory okresliles podczas kompilacji zasobow. Drugi to dokladna nazwa instalowanego pliku - np: Pad.exe } type _DATA = record Title: PChar; FName: PChar; end; { Stala okreslajaca tablice bazujaca na rekordzie. Tablica ta zawiera dokladna nazwe pliku jaki bedzie stworzony podczas instalacji oraz nazwa, ktora zostala podana podczas kompilacji zasobow. } const Files : array [0..1] of _DATA = ((Title: 'PAD'; FName: 'Pad.exe'), (Title: 'README'; FName: 'Readme.txt')); var Res : TResourceStream; I : Integer; { Procedura, korej tresc widzisz pokazuje wskaznik postepu na pasku "Gauge". Jest to tylko tak dla "bajeru", aby pokazac postep w kopiowaniu pliki :) } procedure Postep; var I : Integer; begin For I := 0 to 100 do // petla begin Application.ProcessMessages; Sleep(3); // czekaj 3 milisekundy Gauge.Progress := i; end; end; begin { Jezeli ostatnim znamiem znajdujacym sie w "Dir" jest znak "\" to nie rob nic. Jezeli jest inaczej dopisz ten znak na koncu tekstu. } if Dir.Text[Length(Dir.Text)] = '\' then Dir.Text := Dir.Text else Dir.Text := Dir.Text + '\'; For I := Low(Files) to High(Files) do begin Application.ProcessMessages; // daj odetchnac systemowi Postep; // wywyolaj procedure Res := TResourceStream.Create(hInstance, Files[i].Title, RT_RCDATA); Res.SaveToFile(Dir.Text + Files[i].FName);// zapisz plik na dysku Res.Free; // zwolnij zmienna end; MessageBox(Handle, 'Instalacja zakończona sukcesem :)', 'Informacja', MB_OK + MB_ICONINFORMATION); end; Być może ta procedura wygląda trochę strasznie i trudno. Zastosowałem tutaj rekord oraz tablice, aby pokazać zastosowanie ich w praktyce. Powyższy kod zadziała wtedy gdy na formie umieścisz komponent "Gauge" odpowiedzialny za pokazywanie wskaźnika postępu. Znajdziesz go na palecie "Samples". W przykładzie instalowane są dwa pliki. Gdy masz więcej niż dwa pliki to wystarczy, że do stałych "const" dopiszesz kolejne wartości odpowiadające za pliki. Jeżeli czegoś nie rozumiesz to pisz: boduch@poland.com Zauważ, że w tym przykładzie procedura ( nowa ) została zadeklarowana jako zmienna w sekcji "var". Teraz może ona być wywoływana z każdego miejsca w danej procedurze. Procedura ta odpowiada za pokazywanie wskaźnika postępu ( tak dla bajeru ) żeby fajnie wyglądało ( tak jakby plik się naprawdę instalował ). Pierwszą rzeczą którą procedura robi po uruchomieniu jest sprawdzenie ostatniego znaku w kontrolce "Dir". Aha, kontrolka "Dir" to komponent "Edit". Sprawdzany jest czy ostatnim znakiem jest back-slash. Jeżeli nie to jest on dodawany na końcu. Następnie wywoływana jest pętla która instaluje wszystkie pliki. Jednocześnie z instalowaniem pliku wywoływana jest procedura "Postęp", która pokazuje postęp na komponencie "Gauge". Przy końcu instalacji pokazywane jest okienko z informacją o zakończonej instalacji. |
Reklama To miejsce czeka na twoją reklame. Więcej informacji w dziale Reklama |